/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myftp.core.explorer;

import myftp.app.model.ExplorerModel;
import myftp.app.model.ExplorerTreeModel;
import java.io.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import myftp.app.model.ExplorerTableModel;
import myftp.app.model.FileModel;
import myftp.app.view.ServerTabPartView;
import myftp.app.view.listener.LocalActionListener;
import myftp.core.view.listener.HeaderListener;

/**
 *
 * @author CAVARLE Glenn, LUCAS Stéphane
 *Explorateur de fichiers LOCAUX
 */
public class LocalExplorer extends ExplorerModel {

    /**
     * Constructeur LocalExplorer
     * @param path
     * @param tab
     */
    public LocalExplorer(String path, ServerTabPartView tab) {
        super(null, tab, path);
        this.fileTable.addMouseListener(new LocalActionListener(this, tab));
    }

    /**
     *  Exploration d'un dossier
     * @param node
     */
    protected void exploreNode(ExplorerTreeModel node) {

        ExplorerTreeModel[] fils = getReps(node);

        for (int i = 0; i < fils.length; i++) {
            node.add(fils[i]);
        }
        node.haveBeenExplored();

    }

    /**
     * Listage des répertoires présents
     * @param rep
     */
    protected ExplorerTreeModel[] getReps(ExplorerTreeModel rep) {
        ExplorerTreeModel[] subDirs = new ExplorerTreeModel[0];

        File fich = new File(rep.getPathNode());
        File[] list = fich.listFiles();


        int nbDir = 0;
        if (list != null) {
            for (int i = 0; i < list.length; i++) {
                if (list[i].isDirectory() && !list[i].getName().startsWith(".")) {
                    nbDir++;
                }
            }

            subDirs = new ExplorerTreeModel[nbDir];
            int j = 0;
            for (int i = 0; i < list.length; i++) {
                if (list[i].isDirectory() && !list[i].getName().startsWith(".")) {
                    subDirs[j++] = new ExplorerTreeModel(
                            rep.getPathNode() + list[i].getName() + File.separator);
                }
            }
        }
        return subDirs;
    }

    /**
     * Rafraichissement de la liste des fichiers
     * @param node
     */
    public void refreshFileTab(ExplorerTreeModel node) {

        Collection tableOfFile = new ArrayList();
        try {
            File fich = new File(node.getPathNode());
            /* Listage des fichiers présents */
            File[] fichiers = fich.listFiles();

            for (int i = 0; i < fichiers.length; i++) {
                if (fichiers[i].isFile() && !fichiers[i].getName().startsWith(".")) {
                    /* Ajout du fichier dans le tableau */
                    tableOfFile.add(new FileModel(
                            fichiers[i].getName(),
                            getSizeString((new Long(fichiers[i].length()).intValue())),
                            getDate(new Date(fichiers[i].lastModified()))));
                }
            }
        } catch (NullPointerException e) {
        }

        /* Remplacement du tableau de fichiers par le nouveau */
        ExplorerTableModel fileTab = new ExplorerTableModel(tableOfFile);
        this.fileTable.setModel(fileTab);

        /* Ajout du HeaderListener pour le tri par colonne */
        fileTable.getTableHeader().addMouseListener(new HeaderListener(this.fileTable.getTableHeader()));
        /* Ajout du comparateur pour le tri */
        fileTab.setComparator(new FileComparator());

    }

    /**
     * Récupération de la taille dans un String
     * (avec les puissance d'octets (Ko, Mo...))
     * @param size
     * @return String
     */
    public String getSizeString(Integer size) {

        Double ko, mo, go;
        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(2);
        ko = size / 1024.0;
        if (ko < 1) {
            return (size + " octets");
        }
        mo = ko / 1024;
        if (mo < 1) {
            return (df.format(ko) + " Ko");
        }
        go = mo / 1024;
        if (go < 1) {
            return (df.format(mo) + " Mo");
        }
        return (df.format(go) + " Go");
    }

    /**
     * Récupération de la date dans un String
     * @param aDate
     * @return String
     */
    public String getDate(Date aDate) {

        SimpleDateFormat date = new SimpleDateFormat("dd MMM hh:mm yyyy", new Locale("EN"));
        return date.format(aDate);
    }
}
